/*
 * Vacina.cpp
 *
 *  Created on: 20/08/2012
 *      Author: Caroline Pessoa
 */

#include "Vacina.h"
#include "Pesquisa.h"

int PKV = 0;         // Primary key dos objetos do tipo Vacina
int PKF = 0;         //Primary key dos objetos do tipo Frasco
int PKDV = 0;        //Primary key dos objetos do tipo Doenca em Vacina

Vacina::Vacina(string desc, int id, double pre){ //Construtores

    pk=0;
	descricao=desc;
	idade=id;
	preco=pre;
	quantFrascos = 0;
	quantDoencas = 0;
}

Vacina::Vacina(){

	pk=0;
	descricao="";
	idade=0;
	preco=0;
	quantFrascos = 0;
	quantDoencas = 0;
}

void Vacina::adicionarVacina(string desc, int id, double pre){

    //Altera os dados da Vacina esse metódo é chamado na classe Listas

        PKV++;
        pk=PKV;
        descricao=desc;
        idade=id;
        preco=pre;


}

void Vacina::alterarVacina(string desc, int id, double pre ){

   //Altera dados da Vacina
	descricao = desc;
	idade = id;
	preco = pre;
}

void Vacina::consultarVacina(){

    list <Doenca>::iterator iterDoenca = lDoencaV.begin();
    list <Frasco>::iterator iterFrasco = lFrascoV.begin();

	cout << "Codigo da vacina: " << pk << endl;                        //Mostra dados da Vacina , em seguida mostra os dados 
	cout << "Descricao da vacina: " << descricao << endl;              //de todas as doenças referente a vacina e seus frascos
	cout << "Idade que deve tomar a vacina: " << idade << endl;
	cout << "Preco da vacina: "<< preco << endl;

    while (iterDoenca != lDoencaV.end()){
      	(*iterDoenca).consultarDoenca();
        iterDoenca++;
    }
    while(iterFrasco != lFrascoV.end()){
       	(*iterFrasco).consultarFrasco();
         iterFrasco++;
    }
}

void Vacina::adicionarFrascoV(){
    //Adiciona Frascos da Vacina
	PKF++;
	quantFrascos++;
    lFrascoV.push_back(Frasco(PKF));
}

bool Vacina::excluirFrascoV(int codigo){
    
    //Pesquisa frasco na lista de frascos
    list<Frasco>::iterator frascoIter = Pesquisa::pesquisarFrasco(lFrascoV, codigo);
    //Se for encontrado é apagado e a função retorna true, caso contrario retorna false
    if(frascoIter != lFrascoV.end()){
        lFrascoV.erase(frascoIter);
        quantFrascos--;
        return true;
    }

    return false;
}

bool Vacina::excluirDoencaV(int cod){
     //Pesquisa a Doença
    list<Doenca>::iterator doencaIter = Pesquisa::pesquisarDoenca(lDoencaV, cod);
    //Se existir é apagada senao a função retorna false
    if(doencaIter != lDoencaV.end()){
        lDoencaV.erase(doencaIter);
        quantDoencas--;
        return true;
    }

    return false;
}

string Vacina::getDescricao(){       //Retorna descrição
   return descricao;
}

int Vacina::getIdade(){              //Retorna a qual idade a Vacina é indicada
    return idade;
}

double Vacina::getPreco(){           //Retorna o preço
    return preco;
}

bool Vacina::adicionarDoencaV(string descr, string sintom, string conseq){
     //Adiciona uma nova doença na lista de doenças da vacina
	PKDV++;
    lDoencaV.push_back(Doenca(descr, sintom, conseq, PKDV));
    quantDoencas++;
    return true;
}

bool Vacina::operator==(Vacina busca){

	if(pk == busca.pk)
		return true;
	return false;
}

bool Vacina::operator!=(Vacina busca){

	if(pk != busca.pk)
		return true;
	return false;
}

ostream &operator<<(ostream &out, Vacina &aux ){ 
    //Sobrecarga do operador << para escrever em arquivo

	list <Doenca>::iterator iterDoenca;
	list <Frasco>::iterator iterFrasco;

	iterDoenca = aux.lDoencaV.begin();
	iterFrasco = aux.lFrascoV.begin();

    out << aux.pk << endl;
	out << aux.descricao << endl;
	out << aux.idade << endl;
   	out << aux.preco << endl;

   	out << aux.quantDoencas << endl;

    while (iterDoenca != aux.lDoencaV.end()){
      	out << (*iterDoenca);
      	iterDoenca++;
    }

   	out << aux.quantFrascos << endl;

    while(iterFrasco != aux.lFrascoV.end()){
      	out << (*iterFrasco);
       	iterFrasco++;
    }

	return out;
}

istream &operator>>(istream &in,Vacina &teste ){
    //Sobrecarga do operador >> para leitura de arquivo
	int codigo, cod;
	string desc, sint, conse;

	in >> teste.pk;
	in.ignore();
	in >> teste.descricao;
	in.ignore();
	in >> teste.idade;
	in.ignore();
	in >> teste.preco;
	in.ignore();
	in >> teste.quantDoencas;
	in.ignore();
	int aux = teste.quantDoencas;
	while(aux){
		aux--;
		in >> codigo;
		in.ignore();
		in >> desc;
		in.ignore();
		in >> sint;
		in.ignore();
		in >> conse;
		in.ignore();
		teste.lDoencaV.push_back(Doenca(desc,sint,conse,codigo));
		PKDV++;
	}
	in >> teste.quantFrascos;
	in.ignore();
	aux = teste.quantFrascos;
	while(aux){
		aux--;
		in >> cod;
		in.ignore();
		teste.lFrascoV.push_front(Frasco(cod));
		PKF++;
	}
	return in;

}

Vacina::Vacina(const Vacina &vac){                               
    //Construtor de cópia
	list <Doenca>::const_iterator iterDoencaC = vac.lDoencaV.begin();
	list <Frasco>::const_iterator iterFrascoC = vac.lFrascoV.begin();

	pk=0;
    descricao=vac.descricao;
    idade=vac.idade;
    preco=vac.preco;

    while(iterDoencaC != vac.lDoencaV.end()){
    	lDoencaV.push_back((*iterDoencaC));
        iterDoencaC++;
    }
    while(iterFrascoC != vac.lFrascoV.end()){
    	lFrascoV.push_back((*iterFrascoC));
        iterFrascoC++;
    }
}


int Vacina::getPK(){ //retorna a primary key da vacina
	return pk;
}

bool Vacina::removerDoenca(int pk){
    list<Doenca>::iterator doencaIter;

    //Procura Doença em lista e remove
    
    if((doencaIter = Pesquisa::pesquisarDoenca(lDoencaV, pk)) == lDoencaV.end())
        return false;

    lDoencaV.erase(doencaIter);
    return true;
}

bool Vacina::adicionarDoenca(list<Doenca> doencas, int pk){
    list<Doenca>::iterator doencaIter;
    //Adiciona doença a Vacina
    if((doencaIter = Pesquisa::pesquisarDoenca(doencas, pk)) == doencas.end())
        return false;

    lDoencaV.push_back((*doencaIter));
    return true;

}

list<Doenca> Vacina::getListDoenca(){                   //Retorna a lista de doenças
    return lDoencaV;
}

Vacina::~Vacina(){}
